package main
/**
sync.Map 有以下特性：

无须初始化，直接声明即可
sync.Map 不能使用 map 的方式进行取值和设置等操作，而是使用 sync.Map 的方法进行调用：Store 表示存储，Load 表示获取，Delete 表示删除。
使用 Range 配合一个回调函数进行遍历操作，通过回调函数返回内部遍历出来的值，Range 参数中回调函数的返回值在需要继续迭代遍历时返回 true，终止迭代遍历时，返回 false。
*/
import (
	"fmt"
	"strings"
)

func wordCountFunc(str string) map[string]int{
	var m = make(map[string]int)
	strArray := strings.Fields(str)
	for _, value := range strArray {
		if _, ok := m[value]; !ok {
			// key 不存在
			m[value] = 1
		} else {
			// key 值已存在
			m[value]++
		}
	}
	return m
}

func main() {
	///////////////demo1/////////////
    // var ages sync.Map

    // // 将键值对保存到 sync.Map
    // ages.Store("Conan", 18)
    // ages.Store("Kidd", 23)
    // ages.Store("Lan", 18)

    // // 从 sync.Map 中根据键取值
    // age, ok := ages.Load("Conan")
    // fmt.Println(age, ok)

    // // 根据键删除对应的键值对
    // ages.Delete("Kidd")
    // fmt.Println("删除后的 sync.Map： ", ages)

    // // 遍历所有 sync.Map 中的键值对
    // ages.Range(func(key, value interface{}) bool {
    //     fmt.Println(key, value)
    //     return true
    // })
	///////////////demo2/////////////
	// var m sync.Map

    // // 开启一个 go 程
    // go func() {
    //     // 不停地对 map 进行写入
    //     for true {
    //         m.Store(1, 1)
    //     }
    // }()

    // // 开启一个 go 程
    // go func() {
    //     // 不停的对 map 进行读取并打印读取结果
    //     for true {
    //         value, _ := m.Load(1)
    //         fmt.Println(value)
	// 		time.Sleep(time.Second * 1)
    //     }
    // }()
    // time.Sleep(time.Second * 10)
	/////////////demo3/////////////
	// 创建一个 map
	// m := make(map[int]int)

	// // 开启一个 go 程
	// go func () {
	// 	// 不停地对 map 进行写入
	// 	for true {
	// 		m[1] = 1
	// 	}
	// }()

	// // 开启一个 go 程
	// go func() {
	// 	// 不停的对 map 进行读取
	// 	for true {
	// 		_ = m[1]
	// 	}
	// }()
	// // 运行 10 秒停止
	// time.Sleep(time.Second * 10)

	//封装 wordCountFunc 函数。接收一段英文字符串 str。返回一个 map，记录 str 中每个“单词”出现的次数。
	var str string = "I love my work and I love my family too"
	countFunc := wordCountFunc(str)
	for key, value := range countFunc {
		fmt.Printf("key:%s value:%d\n",key, value)
	}
}
